package com.yifi.module.jwflow.controller;

import cn.hutool.core.util.StrUtil;
import cn.hutool.http.useragent.UserAgent;
import cn.hutool.http.useragent.UserAgentUtil;
import com.influxdb.client.service.CellsService;
import com.jfinal.core.Path;
import com.yifi.common.base.BaseController;
import com.yifi.common.plugins.JwFlowPlugin;
import com.yifi.common.utils.ToolSession;
import io.gitee.yaoshanli.engine.model.*;

import java.util.List;

@Path(value="/jwflow_deal",viewPath = "/jwflow/")
public class jwflow_deal_controller extends BaseController {
    public void index()
    {
        //节点ID
        String node_id = getPara("node_id", "");
        //任务ID
        String task_id = getPara("task_id", "");
        //工作流ID
        String wf_id = getPara("wf_id", "");

        set("task_id", task_id);
        set("node_id", node_id);
        set("wf_id", wf_id);

        //工作流主记录
        WfCodeModel wfCodeModel = JwFlowPlugin.getEngine().flow().getWfCode(wf_id);
        //当前节点信息
        WfNodeModel wfNodeModel= JwFlowPlugin.getEngine().flow().getNode(wf_id,node_id);
        //当前任务
        WfTaskModel wfTaskModel = JwFlowPlugin.getEngine().task().getTask(task_id);

        // 节点类型
        setAttr("node_type", wfNodeModel.getShape());
        // 工作流名称
        setAttr("wf_name",wfCodeModel.getName());
        setAttr("wf_desc",wfCodeModel.getDesc());
        // 节点名称
        setAttr("node_name",wfNodeModel.getName());
        //任务状态（草稿，审批中，已审批）
        setAttr("status", wfTaskModel.getStatus());
        // 是否可发回
        setAttr("deal_back",wfNodeModel.getDeal_back());
        // 节点属性 人工 / 自动
        setAttr("deal_attr",wfNodeModel.getDeal_attr());
        // 是否处理 单人处理 会签处理
        setAttr("deal_type",wfNodeModel.getDeal_type());
        // 是否作废取消
        setAttr("is_cancel",wfNodeModel.getIs_cancel());

        //审批页面展示地址
        String detail_url = wfNodeModel.getDetail_url();
        if (StrUtil.isEmpty(detail_url)) {
            detail_url = wfCodeModel.getDetail_url();
        }
        setAttr("detail_url", detail_url);

        // 流程历史
        List<WfProcessModel> hisList=JwFlowPlugin.getEngine().task().getTaskHisList(task_id);
        setAttr("hislist", hisList);
        //当前用户
        setAttr("uname", ToolSession.getUser(this).getCname());

        String main_table=wfCodeModel.getMain_table();
        //当前节点开始的连接线
        WfLinkModel wfLinkModel=JwFlowPlugin.getEngine().flow().getLink(node_id);
        String condition=wfLinkModel.getCondition();    //条件

        //下一步节点集合，可能一个可能多个需要选择
        List<WfNodeModel> listNode = JwFlowPlugin.getEngine().flow().getNextNodes(wf_id,node_id);

        render("jwflow_deal.html");
    }

    //审批执行下一步操作
    public void dealNext()
    {
        String wf_id=getPara("wf_id","");
        String task_id=getPara("task_id","");
        String node_id=getPara("node_id","");   //选择的节点
        if(StrUtil.isEmpty(node_id))
        {
            WfTaskModel wfTaskModel = JwFlowPlugin.getEngine().task().getTask(task_id);
            //下一步节点ID
            WfNodeModel wfNodeModel = JwFlowPlugin.getEngine().flow().getNextNode(wf_id,wfTaskModel.getNode_id());
            node_id=wfNodeModel.getId();
        }
        String oper=getPara("sel_user",""); //选择的人员
        if(StrUtil.isEmpty(oper))
        {
            oper=ToolSession.getUser(this).getCcode();
        }
        String desc=getPara("desc",""); //意见

        WfTaskModel wfTaskModel = JwFlowPlugin.getEngine().task().executeTask(task_id,node_id,oper,desc);
        if(wfTaskModel!=null)
        {
            renderJson(success("审批成功！"));
        }
        else
        {
            renderJson(error("审批失败！"));
        }
    }

    /**
     * 审批执行发回操作
     * 1 发回开始
     * 2 发回上一节点
     * 3 发回到任意选择的历史节点
     */
    public void dealBack()
    {
        String task_id=getPara("task_id","");
        String wf_id=getPara("wf_id","");
        String oper=ToolSession.getUser(this).getCcode();
        String desc=getPara("desc",""); //意见
        //发回的目标节点
        String node_id=getPara("node_id","");
        WfNodeModel wfNodeModel=JwFlowPlugin.getEngine().flow().getNode(wf_id,node_id);
        String shape=wfNodeModel.getShape();
        if(shape.equals("start-node"))
        {
            renderJson(error("已是开始节点！"));
            return;
        }

        int deal_back=wfNodeModel.getDeal_back();

        WfTaskModel wfTaskModel=null;
        if(deal_back==1)    //发回开始
        {
            wfTaskModel = JwFlowPlugin.getEngine().task().returnTask(task_id,oper,desc);
        }
        else if(deal_back==2)   //发回上一个节点
        {
            wfNodeModel=JwFlowPlugin.getEngine().flow().getPrevNode(wf_id,node_id);
            wfTaskModel = JwFlowPlugin.getEngine().task().executeAndJumpTask(task_id,wfNodeModel.getId(),oper,desc);
        }
        else if(StrUtil.isNotEmpty(node_id)&&deal_back==3)  //发回任意选择的节点
        {
            wfTaskModel = JwFlowPlugin.getEngine().task().executeAndJumpTask(task_id,node_id,oper,desc);
        }
        else
        {   //发回失败
            renderJson(error("发回失败，未选择节点"));
            return;
        }

        if(wfTaskModel!=null)
        {
            renderJson(success("发回成功！"));
        }
        else
        {
            renderJson(error("发回失败！"));
        }
    }

    //审批执行作废
    public void dealCancel()
    {
        String task_id=getPara("task_id","");
        String oper=ToolSession.getUser(this).getCcode();
        String desc=getPara("desc",""); //意见

        //作废流程
        WfTaskModel wfTaskModel = JwFlowPlugin.getEngine().task().cancelTask(task_id,oper,desc);
        if(wfTaskModel!=null)
        {
            renderJson(success("作废成功！"));
        }
        else
        {
            renderJson(error("作废失败！"));
        }
    }
}
